﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Galaktika.BI.Silverlight;
using Visifire.Charts;
using Galaktika.BI.Charting;

namespace Galaktika.BI.Silverlight.Charting
{    

    public static class RanetSeriesFactory
    {
        
        public static bool SupportSeries(ChartSeries series)
        {
            //if (RanetSeriesFactory.GetSeries(series) == null)
            //    return false;
            return true;
        }
        
        public static object SupportSeries(Galaktika.BI.Charting.ChartType chartType)
        {
            switch (chartType)
            {
                case Galaktika.BI.Charting.ChartType.MultiBar:
                    return RenderAs.Column;
                case Galaktika.BI.Charting.ChartType.Line:
                    return RenderAs.Line;
                case Galaktika.BI.Charting.ChartType.Bubble:
                    return RenderAs.Bubble;
                case Galaktika.BI.Charting.ChartType.Percentage:
                    return RenderAs.StackedColumn100;
                case Galaktika.BI.Charting.ChartType.Pie:
                    return RenderAs.Pie;
                case Galaktika.BI.Charting.ChartType.StackedArea:
                    return RenderAs.StackedArea;
                case Galaktika.BI.Charting.ChartType.StackedBar:
                    return RenderAs.StackedColumn;
                default:
                    return null;
            }
        }

        public static RenderAs GetSeriesType(Galaktika.BI.Charting.ChartType chartType)
        {
            switch (chartType)
            {
                case Galaktika.BI.Charting.ChartType.MultiBar:
                    return RenderAs.Column;
                case Galaktika.BI.Charting.ChartType.Line:
                    return RenderAs.Line;
                case Galaktika.BI.Charting.ChartType.Bubble:
                    return RenderAs.Bubble;
                case Galaktika.BI.Charting.ChartType.Percentage:
                    return RenderAs.StackedColumn100;
                case Galaktika.BI.Charting.ChartType.Pie:
                    return RenderAs.Pie;
                case Galaktika.BI.Charting.ChartType.StackedArea:
                    return RenderAs.StackedArea;
                case Galaktika.BI.Charting.ChartType.StackedBar:
                    return RenderAs.StackedColumn;
                default:
                    return RenderAs.Column;
            }
        }
        public static RenderAs RotateSeriesType(ViewType type)
        {
            switch (type)
            {
                case ViewType.Bar3D:
                case ViewType.Bar:
                    return RenderAs.Bar;
                case ViewType.StackedBar:
                case ViewType.StackedBar3D:
                    return RenderAs.StackedBar;
                case ViewType.FullStackedBar:
                case ViewType.FullStackedBar3D:
                    return RenderAs.StackedBar100;
                default:
                    return RenderAs.Bar;
            }
        }

        public static RenderAs GetSeriesType(ChartSeries series)
        {
            switch (series.AViewType)
            {
                case ViewType.Bar:
                case ViewType.Bar3D:
                    return RenderAs.Column;
                case ViewType.StackedBar:
                case ViewType.StackedBar3D:
                    return RenderAs.StackedColumn;
                case ViewType.FullStackedBar:
                case ViewType.FullStackedBar3D:
                    return RenderAs.StackedColumn100;
                case ViewType.Area:
                case ViewType.Area3D:
                    return RenderAs.Area;
                case ViewType.StackedArea:
                case ViewType.StackedArea3D:
                    return RenderAs.StackedArea;
                case ViewType.FullStackedArea:
                case ViewType.FullStackedArea3D:
                    return RenderAs.StackedArea100;
                case ViewType.SplineArea:
                case ViewType.SplineArea3D:
                    return RenderAs.Area;
                case ViewType.CandleStick:
                    return RenderAs.CandleStick;
                case ViewType.Doughnut:
                case ViewType.Doughnut3D:
                    return RenderAs.Doughnut;
                case ViewType.StepLine:
                case ViewType.StepLine3D:
                case ViewType.Line:
                case ViewType.Line3D:
                    return RenderAs.Line;
                case ViewType.Pie:
                case ViewType.Pie3D:
                    return RenderAs.Pie;
                case ViewType.Point:
                    return RenderAs.Point;               
                case ViewType.Spline:
                case ViewType.Spline3D:
                    return RenderAs.Line;                
                case ViewType.Stock:
                    return RenderAs.Stock;                
                case ViewType.RadarArea:
                case ViewType.RadarLine:
                case ViewType.RadarPoint:
                    return RenderAs.SectionFunnel;
                case ViewType.PolarArea:
                case ViewType.PolarLine:
                case ViewType.PolarPoint:
                    return RenderAs.StreamLineFunnel;
            }
            return RenderAs.Column;
        }

        public static bool IsUsed3D(ChartSeries series)
        {
            switch (series.AViewType)
            {
                case ViewType.Bar3D:
                case ViewType.StackedBar3D:
                case ViewType.FullStackedBar3D:
                case ViewType.Area3D:
                case ViewType.StackedArea3D:
                case ViewType.FullStackedArea3D:
                case ViewType.SplineArea3D:
                case ViewType.Doughnut3D:
                case ViewType.Line3D:
                case ViewType.Spline3D:
                case ViewType.Pie3D:
                case ViewType.FullStackedSplineArea3D:
                case ViewType.StackedSplineArea3D:
                    return true;
                default:
                    return false;
            }
        }

        public static bool IsSeriesWithAxes(ChartSeries series)
        {
            switch (series.AViewType)
            {
                case ViewType.Bar:
                case ViewType.Bar3D:
                case ViewType.Line:
                case ViewType.Line3D:
                case ViewType.Point:
                case ViewType.Area:
                case ViewType.Area3D:
                case ViewType.StackedArea:
                case ViewType.StackedArea3D:
                case ViewType.StackedBar:
                case ViewType.StackedBar3D:
                case ViewType.StackedSplineArea:
                case ViewType.StackedSplineArea3D:
                case ViewType.FullStackedArea:
                case ViewType.FullStackedArea3D:
                case ViewType.FullStackedBar:
                case ViewType.FullStackedBar3D:
                case ViewType.FullStackedSplineArea:
                case ViewType.FullStackedSplineArea3D:
                case ViewType.Gantt:
                case ViewType.StepLine:
                case ViewType.StepLine3D:
                case ViewType.CandleStick:
                case ViewType.Spline:
                case ViewType.Spline3D:
                case ViewType.SplineArea:
                case ViewType.SplineArea3D:
                case ViewType.Stock:
                    return true;
                default:
                    return false;
            }
        }

        public static bool IsSeriesWithAxes(Galaktika.BI.Charting.ChartType chartType)
        {
            switch (chartType)
            {
                case Galaktika.BI.Charting.ChartType.MultiBar:
                case Galaktika.BI.Charting.ChartType.Line:
                case Galaktika.BI.Charting.ChartType.Bubble:
                case Galaktika.BI.Charting.ChartType.Percentage:
                case Galaktika.BI.Charting.ChartType.StackedArea:
                case Galaktika.BI.Charting.ChartType.StackedBar:
                    return true;
                default:
                    return false;
            }
            return false;
        }

        //[Obsolete]
        //public static C1.Silverlight.Chart.ChartType GetChartType(ChartSeries series)
        //{
        //    switch (series.AViewType)
        //    {
        //        case ViewType.Bar:
        //        case ViewType.Bar3D:
        //            return ChartType.Bar;
        //        case ViewType.StackedBar:
        //        case ViewType.StackedBar3D:
        //            return ChartType.BarStacked;
        //        case ViewType.FullStackedBar:
        //        case ViewType.FullStackedBar3D:
        //            return ChartType.BarStacked100pc;
        //        case ViewType.Area:
        //        case ViewType.Area3D:
        //            return ChartType.Area;
        //        case ViewType.StackedArea:
        //        case ViewType.StackedArea3D:
        //            return ChartType.AreaStacked;
        //        case ViewType.FullStackedArea:
        //        case ViewType.FullStackedArea3D:
        //            return ChartType.AreaStacked100pc;
        //        case ViewType.SplineArea:
        //        case ViewType.SplineArea3D:
        //            return ChartType.AreaSmoothed;
        //        case ViewType.CandleStick:
        //            return ChartType.Candle;
        //        case ViewType.Doughnut:
        //        case ViewType.Doughnut3D:
        //            return ChartType.PieDoughnut;
        //        case ViewType.Gantt:
        //            return ChartType.Gantt;
        //        case ViewType.Line:
        //        case ViewType.Line3D:
        //            return ChartType.Line;
        //        case ViewType.Pie:
        //        case ViewType.Pie3D:
        //            return ChartType.Pie;
        //        case ViewType.Point:
        //            return ChartType.XYPlot;
        //        case ViewType.RadarArea:
        //            return ChartType.RadarFilled;
        //        case ViewType.RadarPoint:
        //            return ChartType.RadarSymbols;
        //        case ViewType.RadarLine:
        //            return ChartType.Radar;
        //        case ViewType.Spline:
        //        case ViewType.Spline3D:
        //            return ChartType.LineSmoothed;
        //        case ViewType.StepLine:
        //        case ViewType.StepLine3D:
        //            return ChartType.LineStacked;
        //        case ViewType.Stock:
        //            return ChartType.HighLowOpenClose;
        //    }
        //    return ChartType.Column;
        //}
        //[Obsolete]
        //public static C1.Silverlight.Chart.DataSeries GetSeries(ChartSeries series)
        //{
        //    C1.Silverlight.Chart.DataSeries s;       
        //    return new C1.Silverlight.Chart.DataSeries();
        //}

        //[Obsolete]
        //public static C1.Silverlight.Chart.DataSeries GetSeriesWithAxes(ChartSeries series)
        //{
        //    if (IsSeriesWithAxes(series))
        //        return GetSeries(series);
        //    return null;
        //}

        //[Obsolete]
        //public static T GetSeries<T>(ChartSeries series)
        //    where T : C1.Silverlight.Chart.DataSeries
        //{
        //    try
        //    {
        //        var s = Activator.CreateInstance(typeof(T)) as T;
        //        return s;
        //    }
        //    catch (Exception e)
        //    {
        //        throw new NotSupportedException(Localization.Exc_SeriesNotSupported, e);
        //    }
        //}
    }

    public class C1ChartSeriesViewHelper
    {
        private static C1ChartSeriesViewHelper m_ChartSeriesHelper;

        #region Constructors
        private C1ChartSeriesViewHelper()
        {
        }
        #endregion Constructors

        #region Private Properies
        private static C1ChartSeriesViewHelper Helper
        {
            get
            {
                if (m_ChartSeriesHelper == null)
                {
                    m_ChartSeriesHelper = new C1ChartSeriesViewHelper();
                }
                return m_ChartSeriesHelper;
            }
        }
        #endregion Private Properies

        #region Public Methods

        /// <summary>
        /// Возвращает массив строк, содержащий список видов серий, 
        /// которые поддерживаются диаграммой targetDiagram
        /// </summary>
         /// <returns></returns>
        //public static string[] GetSupportedViewTypes(Diagram targetDiagram)
        //{
        //    List<string> viewTypesAll = new List<string>(SeriesViewFactory.StringIDs);
        //    List<string> viewTypesSupported = new List<string>();
        //    foreach (string candidateViewTypeName in viewTypesAll)
        //    {
        //        ViewType viewType = SeriesViewFactory.GetViewType(candidateViewTypeName);
        //        if (SupportDiagram(viewType, targetDiagram))
        //        {
        //            viewTypesSupported.Add(candidateViewTypeName);
        //        }
        //    }

        //    return viewTypesSupported.ToArray();
        //}


        /// <summary>
        /// Возвращается серия по виду серии
        /// </summary>
        /// <param name="targetViewType">Тип вида серии</param>
        /// <returns></returns>
        //public static C1.Silverlight.Chart.DataSeries GetView(ViewType targetViewType)
        //{
        //    return null;//(Series)SeriesViewFactory.CreateInstance(targetViewType);
        //}

        /// <summary>
        /// Возвращает тип диаграммы в зависимости от серии
        /// </summary>
        /// <param name="seriesView">Серия, диаграмма которой определяется</param>
        /// <returns></returns>
        //public static C1.Silverlight.Chart.DataSeries GetDiagram(C1.Silverlight.Chart.DataSeries seriesView)
        //{
        //    return new C1.Silverlight.Chart.DataSeries();
        //}

        /// <summary>
        /// Поддерживает ли текущая серия диаграмму targetDiagram
        /// </summary>
        /// <param name="series">Серия, для которой проверяется совместимость с диаграммой targetDiagram</param>
        /// <param name="targetDiagram">Диаграмма, соответствие с которой определяется</param>
        /// <returns></returns>
        /// <summary>
        //public static bool SupportDiagram(ChartSeries series, C1.Silverlight.Chart.DataSeries targetDiagram)
        //{
        //    // отсутствие диаграммы означает, что серия поддерживает диаграмму
        //    if (targetDiagram == null)
        //    {
        //        return true;
        //    }

        //    C1.Silverlight.Chart.DataSeries seriesView = null;//SeriesViewFactory.CreateInstance(series.AViewType);
        //    //Type seriesDiagramType = GetDiagram(seriesView).GetType();
        //    //Type targetDiagramType = targetDiagram.GetType();

        //    return true;//seriesDiagramType.Equals(targetDiagramType);
        //}

        /// <summary>
        /// Поддерживает ли тип базовой серии диаграмму targetDiagram
        /// </summary>
        /// <param name="seriesView">Базовая серия, для которой проверяется совместимость с диаграммой targetDiagram</param>
        /// <param name="targetDiagram">Диаграмма, соответствие с которой определяется</param>
        /// <returns></returns>
        /// <summary>
        //public static bool SupportDiagram(SeriesViewBase seriesView, Diagram targetDiagram)
        //{
        //    // отсутствие диаграммы означает, что серия поддерживает диаграмму
        //    if (targetDiagram == null)
        //        return true;

        //    Type seriesDiagramType = GetDiagram(seriesView).GetType();
        //    Type targetDiagramType = targetDiagram.GetType();

        //    return seriesDiagramType.Equals(targetDiagramType);
        //}

        /// <summary>
        /// Поддерживает ли вид базовой серии диаграмму targetDiagram
        /// </summary>
        /// <param name="viewType">Вид базовой серии, для которого проверяется совместимость с диаграммой targetDiagram</param>
        /// <param name="targetDiagram">Диаграмма, соответствие с которой определяется</param>
        /// <returns></returns>
        /// <summary>
        //public static bool SupportDiagram(ViewType viewType, Diagram targetDiagram)
        //{
        //    // отсутствие сравниваемой диаграммы означает, что серия поддерживает диаграмму
        //    if (targetDiagram == null)
        //    {
        //        return true;
        //    }

        //    SeriesViewBase seriesView = SeriesViewFactory.CreateInstance(viewType);//ChartSeriesViewHelper.GetView(viewType);
        //    Type seriesDiagramType = GetDiagram(seriesView).GetType();
        //    Type targetDiagramType = targetDiagram.GetType();

        //    return seriesDiagramType.Equals(targetDiagramType);
        //}
        #endregion Public Methods
    }

}
